package com.zxw.设计模式.行为型模式.观察者模式.摇号应用实例.service;

import com.zxw.设计模式.行为型模式.观察者模式.摇号应用实例.EventManager;
import com.zxw.设计模式.行为型模式.观察者模式.摇号应用实例.domain.LotteryResult;
import com.zxw.设计模式.行为型模式.观察者模式.摇号应用实例.监听者.MQEventListener;
import com.zxw.设计模式.行为型模式.观察者模式.摇号应用实例.监听者.MessageEventListener;

/**
 * @projectName: util-cloud
 * @package: com.zxw.设计模式.行为型模式.观察者模式.摇号应用实例.service
 * @className: lotteryService
 * @author: zhangxuewei
 * @description: 开奖服务
 * @date: 2023/10/9 14:24
 * @version: 1.0
 */
public abstract class LotteryService {

    // 事件管理器
    private EventManager eventManager;

    public LotteryService() {
        // 注册事件类型
        eventManager = new EventManager(EventManager.EventType.MQ, EventManager.EventType.MESSAGE);

        // 注册订阅
        eventManager.subscribe(EventManager.EventType.MQ, new MQEventListener());
        eventManager.subscribe(EventManager.EventType.MESSAGE, new MessageEventListener());
    }

    // 唤醒发布消息
    public LotteryResult lotteryAndMessage(String userId) {
        // 具体业务实现 *****
        LotteryResult res = lottery(userId);
        // 实现后触发的其他操作 **
        eventManager.notify(EventManager.EventType.MESSAGE, res);
        eventManager.notify(EventManager.EventType.MQ, res);
        return res;
    }

    public abstract LotteryResult lottery(String userId);

}
